iPhone XのHome Indicatorの表示/非表示を制御する
Home Indicatorとは
iPhone Xでアプリを起動すると画面下部に表示されるIndicatorです。
iPhone Xではこの部分を上にスワイプするとホーム画面に戻ることができます。
検証環境
本エントリは以下の環境で検証を行っています。
- macOS Sierra バージョン 10.12.6
- Xcode Version 9.1 (9B55)
- Swift 4
- iPhone X シミュレーター iOS 11.1
Home Indicatorを消したい
デフォルトではこのIndicatorは常に表示されていますが、アプリや画面によっては消したい場合もあるかと思います。(ゲームとか)
UIViewControllerにHome Indicatorの表示/非表示に関連するメソッドが定義されているのでこれらを使用します。
extension UIViewController { // Override to return a child view controller or nil. If non-nil, that view controller's home indicator auto-hiding will be used. If nil, self is used. Whenever the return value changes, -setNeedsHomeIndicatorAutoHiddenUpdate should be called. @available(iOS 11.0, *) open func childViewControllerForHomeIndicatorAutoHidden() -> UIViewController? // Controls the application's preferred home indicator auto-hiding when this view controller is shown. @available(iOS 11.0, *) open func prefersHomeIndicatorAutoHidden() -> Bool // This should be called whenever the return values for the view controller's home indicator auto-hiding have changed. @available(iOS 11.0, *) open func setNeedsUpdateOfHomeIndicatorAutoHidden() }
prefersHomeIndicatorAutoHidden()
ViewControllerがOverrideしてtrue
を返せばIndicatorは消え、false
を返せばIndicatorは表示されます。
デフォルトはfalseです。
setNeedsUpdateOfHomeIndicatorAutoHidden()
Home Indicatorの表示/非表示の設定を更新したことをUIKitに通知するためのメソッドです。
このメソッドを呼ぶことでprefersHomeIndicatorAutoHidden
が呼ばれて表示/非表示が更新されます。
childViewControllerForHomeIndicatorAutoHidden()
UINavigationControllerのようなコンテナビューコントローラーを使う場合に、子ビューコントローラーがHome Indicatorの表示/非表示を制御する必要がある場合はこのメソッドをオーバーライドして該当の子ビューコントローラーを返します。デフォルトの実装ではnilを返すようになっていて、その場合は自分自身(コンテナビューコントローラー)のprefersHomeIndicatorAutoHidden
が呼ばれます。
やってみた
早速試してみます。以下のようにシンプルに1つ画面を用意し、UISwitchによってIndicatorを消したり表示したりしてみます。
実装
実装は以下のように非常にシンプルです。
prefersHomeIndicatorAutoHidden()
をoverrideし、UISwitchのON/OFF状態によってIndicatorの表示/非表示を切り替えています。
ポイントはsetNeedsUpdateOfHomeIndicatorAutoHidden()
を呼んでいるところです。
import UIKit class ViewController: UIViewController { @IBOutlet weak var hideHomeIndicatorSwitch: UISwitch! @IBAction func hideHomeIndicatorSwitchValueChanged(_ sender: Any) { setNeedsUpdateOfHomeIndicatorAutoHidden() } // MARK: - Override Methods override func prefersHomeIndicatorAutoHidden() -> Bool { return hideHomeIndicatorSwitch.isOn } }
実行結果
以下のようにUISwitchのON/OFF状態によってIndicatorの表示/非表示が切り替わりました。
消える時はアニメーションでゆっくり消えますが表示されるのは一瞬ですね。
おわりに
今回はHome Indicatorの表示/非表示を制御する方法をご紹介しました。
もしHome Indicatorを消したい時が出てきたら本エントリを思い出していただければと思います。